ゆるふわシェル問題 その2
全部で8問
そんなに難しくないはず
だいたい1コマンドで解ける
使う技術
問題
Q1 1コマンドで所有者、所有グループをwww-data、権限を0750に指定しつつ/workディレクトリを作成してください
code:a1.sh
install -d -o www-data -g www-data -m 0750 /work
問題の意図
1コマンドで権限を設定する方法を把握する
chmod, chownを別コマンドで実行するのは事故を誘発するので、1コマンドで設定できる方法を使うほうが安全 解説
-dディレクトリを作成する
-o所有者(owner)の設定
-g所有グループ(group)の設定
-mread/write/executeの権限(mode)の設定
Q2 以下のファイルのファイル名末尾の日付をファイル名の先頭に入れ替えた名前にリネームしてください
code:q2.sh
touch web.log.2020-01-0{1..3}
touch db.log.2020-01-0{1..3}
touch app.log.2020-01-0{1..3}
ls *log*
2020-01-01_web.log
code:a2.sh
ls | sed -E 's/^(web|db|app)\.(log)\.(.*)/mv & \3_\1.\2/g' | bash
ls *log*
問題の意図
ファイル名の部分修正や入れ替えを大量のファイルに対して実施することは度々ある
解説
置換後の文字列でmvのコマンド列を生成
生成したコマンド列をbashに食わせてシェルを実行
Q3 現在日時の7日前の日付をyyyy-mm-dd形式で出力してください
code:a3.sh
date -d "7 days ago" +%Y-%m-%d
問題の意図
特定の日付を出力する方法を把握する
ログローテートみたいな処理でN日前のデータを操作したくなることは度々ある
解説
-d日時の指定
+%Y-%m-%d日付の書式の指定
Q4 以下のファイルをファイル名に含まれる数値の降順に出力してください
code:q4.sh
touch yurufuwa_{1..11}.txt
ls yuru*.txt
code:a5.sh
ls yuru*.txt | sort -t _ -rnk2
問題の意図
0埋めされていないデータをソートする方法を把握する
データ数の上限が分かってるときは0埋めするように予め作っておいたほうが楽
解説
-t数値の直前に_があるので、それを区切り文字として指定
-n数値ソート
-k22列目をソートのキーに指定
-r降順ソート。デフォルトは昇順なので反転する
Q5 以下のテキストファイルaの内、重複する行のみ出力してください
code:q5.sh
cat << EOS | tee a
a
b
a
c
d
b
e
EOS
code:a5.sh
cat a | sort | uniq -d
問題の意図
重複してるデータだけ探したいときは度々あるから
解説
uniqは前提としてsortされたデータに対して実行しないときちんとユニークにしてくれない
sortとuniqはほぼセットで使う
-dで重複してるデータのみ出力する
Q6 寿司という漢字を使わずに寿司と出力してください
code:a6.sh
echo -e $'\U5BFF\U53F8'
問題の意図
他の人がどういう回答をだすか気になった
解説
16進数で寿司
Q7 muscularというNode.jsプログラムのpackage.jsonのみを探して出力してください。muscular/node_modules配下のpackage.jsonは出力しないでください
code:a7.sh
find / -maxdepth 7 -name 'package.json' | grep muscular
find / -name 'package.json' | grep muscular | grep -Ev "(node_modules).*\1"
問題の意図
ファイルがどこにあるかわからないときの調査方法を把握する
ファイルを探すときはだいたいfindとgrepを組み合わせる
解説
特にいうことがない
Q8 中身はなんでもいいので1MBのファイルを作成してください
code:a8.sh
dd if=/dev/zero of=a.dat bs=1MB count=1
問題の意図
ダミーデータを作る方法を把握する
巨大なファイルを作ってテストしたりするときに使ったりする
解説
ddではデータをコピーしてファイルやデバイスに書き込んだりできる
書き込むときに書き込むサイズと、回数を指定できる
以上
余談